前一天我已經完成主村莊第一版雛形,VillageScene 中已經有基本的草地、道路、建築與村莊裝飾。場景有了之後,接下來就需要讓玩家角色正式出現在遊戲中。因此 Day 9 的目標,是建立玩家角色 Prefab,並完成最基本的待機與走路動畫。
這一天先不撰寫玩家移動程式,因為在開始寫控制之前,需要先把角色素材、動畫和 Animator Controller 整理好。這樣 Day 10 撰寫移動系統時,就可以直接使用已經完成的 Player Prefab,而不是邊寫程式邊回頭整理素材。

玩家角色素材使用的是 Day 5 匯入的 Anokolisa 角色素材,位置在 Assets/ImportedAssets/Anokolisa_TopdownRPG/Characters。目前可用的基本動畫包括 Idle_Base、Walk_Base 和 Run_Base。Day 9 先處理 Idle 和 Walk,Run 先保留到後續需要時再使用。
一開始我先檢查角色圖片的匯入設定。由於角色是像素風素材,所以設定上要保持清晰,避免 Unity 預設的過濾與壓縮讓圖片變模糊。

角色圖片的設定和前面地圖素材類似,貼圖類型設定為 Sprite (2D and UI),Sprite Mode 設定為 Multiple,Pixels Per Unit 設定為 16,Filter Mode 設定為 Point,Compression 設定為 None。另外,角色圖目前還不需要 Unity 自動產生物理形狀,所以也取消了 Generate Physics Shape。
不過角色素材和前幾天地圖 Tile 不一樣。地圖素材是 16×16 的小格,但玩家角色每一格動畫是 64×64。因此在 Sprite Editor 中不能用 16×16 切,而是要用 64×64 切片。

我先處理 Idle_Down-Sheet.png。這張圖片尺寸是 256×64,因此用 64×64 切片後,會得到 4 張待機動畫影格。切片方式使用 Grid By Cell Size,Pixel Size 設定為 X 64、Y 64,Offset 和 Padding 都設定為 0。切完後按下 Apply,讓 Unity 將切片結果寫入素材設定。
完成 Idle Down 後,我也用相同方式處理 Idle_Side-Sheet.png 和 Idle_Up-Sheet.png。這些素材都切成 4 張 Sprite,之後可以用來建立不同方向的待機動畫。
接著處理 Walk 動畫。Walk 動畫每張圖是 384×64,所以用 64×64 切片後,每個方向會得到 6 張 Sprite。

我依序處理 Walk_Down-Sheet.png、Walk_Side-Sheet.png 和 Walk_Up-Sheet.png,每張都使用相同的 64×64 Grid 切片。完成後,玩家素材就已經具備建立基本待機與走路動畫的條件。
素材切好後,下一步是在場景中建立玩家物件。我在 VillageScene 的 Hierarchy 中建立一個空物件,命名為 Player,並加上 Sprite Renderer 元件。接著將 Idle_Down-Sheet_0 指定給 Sprite Renderer,讓玩家先顯示待機向下的第一格圖像。

建立 Player 物件時,我將角色放在村莊下方入口附近,也就是之後玩家從教學區回到村莊時比較合理的位置。Sprite Renderer 的 Order in Layer 設定為 20,確保玩家會顯示在地圖、道路與大多數場景物件上方。
接著我整理專案資料夾,專門建立玩家相關資源的存放位置。這樣之後動畫、Prefab 和控制腳本都能集中管理,不會散落在專案各處。

我建立了 Assets/Game/Player/Animations 和 Assets/Game/Player/Prefabs 兩個資料夾。Animations 用來放玩家動畫片段與 Animator Controller,Prefabs 用來放最後建立好的 Player Prefab。這種分類雖然看起來只是整理資料夾,但對後續維護很重要,尤其是專案逐漸變大之後。
接著開始建立第一個動畫片段:Player_Idle_Down.anim。我選取 Hierarchy 中的 Player,打開 Animation 視窗,建立新的 Animation Clip,並將它存到 Assets/Game/Player/Animations。

建立動畫後,我把 Idle_Down-Sheet_0 到 Idle_Down-Sheet_3 四張 Sprite 依序放進 Animation 時間軸,並將 Samples 設定為 6。這樣角色待機時會有輕微的動畫效果,不會完全靜止,也不會播放得太快。
建立第一個動畫時,Unity 也自動幫 Player 加上了 Animator 元件,並產生 Animator Controller。為了避免和 Hierarchy 裡的 Player 物件混淆,我將 Animator Controller 改名為 PlayerAnimator.controller。

這一步完成後,Player 物件已經有 Sprite Renderer 和 Animator,Animator 的 Controller 也正確指向 PlayerAnimator.controller。這代表玩家物件已經不只是靜態圖片,而是可以由 Animator 控制播放動畫。
接著,我將 Hierarchy 中的 Player 拖到 Assets/Game/Player/Prefabs 資料夾中,建立 Player.prefab。

建立 Prefab 的好處是,之後不管是在村莊、新手教學區,還是其他地牢場景,都可以直接使用同一個玩家物件。如果未來需要修改玩家的 Sprite Renderer、Animator、碰撞或腳本,也可以集中修改 Prefab,而不用每個場景都手動調整一次。
完成 Idle 動畫與 Prefab 後,我又建立了第一個走路動畫 Player_Walk_Down.anim。這一步是為 Day 10 的玩家移動系統做準備,讓角色之後不只會站著,也能在移動時切換成走路動畫。

我將 Walk_Down-Sheet_0 到 Walk_Down-Sheet_5 六張 Sprite 放進 Animation 時間軸,並將 Samples 設定為 8。走路動畫比待機動畫影格更多,因此播放起來會比較有動作感。Day 9 先只建立向下走路動畫,其他方向之後再依移動系統需求補上。
接著我打開 Animator 視窗,確認 PlayerAnimator.controller 中已經有 Player_Idle_Down 和 Player_Walk_Down 兩個狀態。

目前 Player_Idle_Down 是橘色狀態,代表它是 Animator 的 Default State。也就是說,遊戲開始時玩家會先播放待機動畫。Player_Walk_Down 也已經存在於 Animator 中,但目前還沒有設定 Transition。這是刻意保留的,因為動畫切換條件應該等 Day 10 寫玩家移動控制時再一起處理。
最後,我檢查了 Player Prefab 是否有尚未套用的 Overrides。確認結果顯示沒有未套用的覆蓋項目,代表 Hierarchy 中的 Player 和 Prefab 內容一致。

完成這一步後,Day 9 的目標就完成了。這一天我沒有急著撰寫移動程式,而是先完成玩家角色的素材切片、Player 物件、Idle 動畫、Walk 動畫、Animator Controller 和 Player Prefab。
透過 Day 9 的整理,玩家角色已經具備進入遊戲場景的基本條件。下一步 Day 10 就可以開始撰寫玩家移動控制,讓目前建立好的 Player Prefab 可以在 VillageScene 中上下左右移動,並開始和動畫狀態結合。